﻿/* 
 * File:   str_ext.h
 * Author: aple
 */

#ifndef __STR_EXT_H_H_
#define	__STR_EXT_H_H_

#include "stdint.h"

#ifdef	__cplusplus
extern "C" {
#endif

	/*****************************************************************************
	* @brief  大小写转换.
	*****************************************************************************/
	uint16_t ascii_to_upper(void *pSrc, uint16_t Len); //转换ascii为大写
	uint16_t ascii_to_lower(void *pSrc, uint16_t Len); //转换ascii为小写
	uint16_t str_to_upper(void *pSrc); //转换ascii为大写
	uint16_t str_to_lower(void *pSrc); //转换ascii为小写
	
	uint16_t ascii_to_upper_with_end(void *Src, uint8_t ch_end, uint16_t Len);
	uint16_t ascii_to_lower_with_end(void *Src, uint8_t ch_end, uint16_t Len);
	uint16_t str_to_upper_with_end(void *Src, char ch_end);
	uint16_t str_to_lower_with_end(void *Src, char ch_end);
	
	/*****************************************************************************
	* @brief  列表比较.
	* \param[in] xx1    源数据1
	* \param[in] xx2    源数据2
	* \param[in] Len    长度
	* \retval:  Array1 > Array2           1
	*           Array1 = Array2           0
	*           Array1 < Array2           -1
	*****************************************************************************/
	int8_t comp_array(const uint8_t *Array1, const uint8_t *Array2, uint16_t Len); //数组比较
	int8_t comp_string(const uint8_t *str1, const uint8_t *str2, uint16_t Len); //字符串比较
	int8_t comp_u8(const void * s1, const void * s2, uint16_t Len);
	int8_t comp_u16(const void * s1, const void * s2, uint16_t Len);
	int8_t comp_u32(const void * s1, const void * s2, uint16_t Len);

	/*memory */
	void copy_u8(const void * src, void * des, uint32_t len); //len 指定元素数量
	void copy_u16(const void * src, void * des, uint32_t len); //len 指定元素数量
	void copy_u32(const void * src, void * des, uint32_t len); //len 指定元素数量
	uint16_t copy_str(const void * src, void * des, uint16_t len_max); //len 指定元素数量 , 尾部强制加0
	void set_u8(void * des, uint8_t data, uint32_t len); //len 指定元素数量
	void set_u16(void * des, uint16_t data, uint32_t len); //len 指定元素数量
	void set_u32(void * des, uint32_t data, uint32_t len); //len 指定元素数量

	//str data
	uint16_t str_replace_ch(void *dat, uint8_t ch_old, uint8_t ch_new);
	uint16_t dat_replace_uch(void *dat, uint8_t ch_old, uint8_t ch_new, uint16_t len);
	uint16_t str_remove_ch(void *dat, uint8_t ch); //删除指定字符，后续字符前移
	uint16_t str_remove_ch_with_end(void *dat, uint8_t ch_rm, uint8_t ch_end); //删除指定字符，后续字符前移 ,遇到ch_end 结束
	uint16_t str_remove_ctr_ascii(void *str); //删除0x20以内除\r或\n外的字符，后续字符前移
	uint16_t str_remove_l20_ascii(void *str); //删除0x20以内的字符，后续字符前移
	uint16_t str_remove_la20_ascii_at_tail(void *str); //删除尾部控制符及空格
	uint16_t str_remove_tail(void *str); // 删除字符串尾部一个字符
	uint16_t str_remove_low(void *str, uint8_t ch_limite); // 删除字符串中小于指定字符的字符
	uint16_t str_remove_high(void *str, uint8_t ch_limite); // 删除字符串中大于指定字符的字符
	uint16_t str_get_line_site_list(void *src, void *des, uint16_t max_len); //获取行首位置列表
	int16_t str_site_next_line(void *src, int16_t site_now);//从指定位置搜索下一行行首位置
	int16_t str_search_ch(void *dat, uint8_t ch); //-1 is none
	int16_t str_search_ch_ext(void *dat, uint8_t ch, int16_t n); // 搜索字符串中第n个指定字符的位置
	uint16_t str_get_inum_site_list(void *src, void *des, uint16_t max_len); //搜索数字字符串位置列表，仅整数，末尾后加-1
	uint16_t str_get_fnum_site_list(void *src, void *des, uint16_t max_len); //搜索数字字符串位置列表，含小数，末尾后加-1
	int16_t str_search_inumch(void *dat); //-1 is none （符号+数字，或者第一个数字的位置）
	int16_t str_search_fnumch(void *dat); //-1 is none （符号+数字，或者第一个数字的位置）
	uint16_t str_get_line(void *src, void *des); //\r or \n is end， end char is not copy，返回长度
	uint16_t str_get_str(void *src, void *des, uint8_t end_ch); //copy start at first, end ch is not copy，返回长度
	uint16_t str_get_fnumstr(void *src, void *des); //从起始位置复制数字字符串，含小数，返回长度
	uint16_t str_search_get_fnumstr(void *src, void *des); //搜索数字字符串并截取，含小数，返回长度
	uint16_t str_get_inumstr(void *src, void *des); //从起始位置复制数字字符串，仅整数，返回长度
	uint16_t str_search_get_inumstr(void *src, void *des);//搜索数字字符串并截取，仅整数，返回长度
	uint16_t str_is_fnum(void *src); //判断字符串是否为一个纯数字(包含小数)字符串，返回长度。0代表不是一个纯数字。
	uint16_t str_is_inum(void *src); //判断字符串是否为一个纯数字(仅整数)字符串，返回长度。0代表不是一个纯数字。
	void str_insert_ch(char * str, uint16_t site, char ch);//指定位置插入字符，源数据后移
	void str_add(char * str, char * str_add); //在源字符串尾部追加字符串
	void str_insert_str(char * str, uint16_t site, char * str_in);//指定位置插入字符串，源数据后移

	/*-在指定位置插入数据，后续源数据后移-*/
	void dat8_insert(uint8_t *list, uint16_t size, uint16_t site, uint8_t dat_in);
	void dat16_insert(uint16_t *list, uint16_t size, uint16_t site, uint16_t dat_in);
	void dat32_insert(uint32_t *list, uint16_t size, uint16_t site, uint32_t dat_in);


#ifdef	__cplusplus
}
#endif

#endif	/* __STR_EXT_H_H_ */

